/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;

/**
 * @author  Administrador
 */
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.db.SqlManager;
import com.exception.DataException;

import com.javabeans.*;

public class AdminRolUsuario implements RolUsuarioManager{
    private Connection c;

    public AdminRolUsuario(Connection c){
        this.c = c;
    }
    @Override
    public List<RolUsuario> getDocentesActivos() throws DataException {
        List<RolUsuario> rol_usuariosActivos = new ArrayList<RolUsuario>();
        try{
            rol_usuariosActivos = this.getUsuarios(true);
        }catch(DataException e){
            throw new DataException("Error!!! AdminRolUsuario -> getDocentesActivos() "+e.getMessage());
        }
        return rol_usuariosActivos;
    }
    @Override
    public List<RolUsuario> getDocentesInactivos() throws DataException {
        List<RolUsuario> rol_usuariosInactivos = new ArrayList<RolUsuario>();
        try{
            rol_usuariosInactivos = this.getUsuarios(false);
        }catch(DataException e){
            throw new DataException("Error!!! AdminRolUsuario -> getDocentesInactivos() "+e.getMessage());
        }
        return rol_usuariosInactivos;
    }
    // metodo que graba un perfil de un usuario
    @Override
    public void saveRolUsuario(RolUsuario r_u) throws DataException{
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "INSERT INTO ROL_USUARIO VALUES("+r_u.getIdUsuario();
            query += ", "+r_u.getIdRol();
            query += ", 1)";
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException e){
            throw new DataException("Error! AdminRolUsuario -> saveRolUsuario(RolUsuario r_u) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
    }
    
    /*==============================================================*/
    /* Valida Usuario para iniciar session                          */
    /*==============================================================*/
    @Override
    public RolUsuario validarUsuario(String login, String password) throws DataException{
        RolUsuario rolUsuario = new RolUsuario();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT U.IDUSUARIO";
            query += ", U.NOMBRE";
            query += ", APELLIDO";
            query += ", EMAIL";
            query += ", FOTO";
            query += ", DATE_FORMAT(FECHANAC,'%d/%m/%Y') AS FECHANAC";
            query += ", LOGIN";
            query += ", R.IDROL IDROL, R.NOMBRE NOMBRE_ROL";
            query += " FROM USUARIO U, ROL_USUARIO R_U";
            query += " INNER JOIN ROL R ON R_U.IDROL=R.IDROL AND R.IDROL=1"; // idRol = 1 = Administrativo
            query += " WHERE U.IDUSUARIO=R_U.IDUSUARIO";
            query += " AND U.LOGIN = '"+login;
            query += "' AND U.PASSWORD = '"+password;
            query += "' AND R_U.ACTIVO = 1";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next()){
                Usuario u =new Usuario();
                u.setIdUsuario(rs.getInt("IDUSUARIO"));
                u.setNombre(rs.getString("NOMBRE"));
                u.setApellido(rs.getString("APELLIDO"));
                u.setEmail(rs.getString("EMAIL"));
                u.setFoto(rs.getString("FOTO"));
                u.setFechaNac(rs.getString("FECHANAC"));
                u.setLogin(login);
                Rol rol = new Rol();
                rol.setIdRol(rs.getInt("IDROL"));
                rol.setNombre(rs.getString("NOMBRE_ROL"));
                rolUsuario.setIdUsuario(u.getIdUsuario());
                rolUsuario.setIdRol(rol.getIdRol());
                rolUsuario.setUsuario(u);
                rolUsuario.setRol(rol);
            }
        }catch(SQLException e){
            throw new DataException("Error! AdminRolUsuario -> validarRolUsuario(idEmpresa, login, password) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return rolUsuario;
    }    
    
    public List<RolUsuario> getUsuarios(boolean activo) throws DataException{
        List<RolUsuario> rolUsuarios = new ArrayList<RolUsuario>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT U.IDUSUARIO";
            query += ", U.NOMBRE";
            query += ", U.APELLIDO";
            query += ", U.CI";
            query += ", U.EXPEDIDOEN";
            query += ", U.GENERO";
            query += ", U.TELEFONO";
            query += ", U.EMAIL";
            query += ", U.DIRECCION";
            query += ", DATE_FORMAT(U.FECHANAC,'%d/%m/%Y') AS FECHANAC";
            query += ", U.LOGIN";
            query += ", PA.IDPAIS, PA.NOMBRE, PA.SIGLA";
            query += ", C.IDCIUDAD, C.NOMBRE, C.SIGLA";
            query += ", CA.IDCATEGORIA, CA.NOMBRE, CA.SIGLA";
            query += ", DD.LOCALIDAD";
            query += ", R.IDROL, R.NOMBRE";
            query += " FROM USUARIO U";
            query += " INNER JOIN (DETALLE_DOCENTE DD INNER JOIN (CIUDAD C INNER JOIN PAIS PA ON C.IDPAIS=PA.IDPAIS) ON DD.IDPAIS=C.IDPAIS AND DD.IDCIUDAD=C.IDCIUDAD)";
            query += " ON U.IDUSUARIO=DD.IDDETALLE_DOCENTE, CATEGORIA CA, ROL_USUARIO RU, ROL R";
            query += " WHERE DD.IDCATEGORIA=CA.IDCATEGORIA AND U.IDUSUARIO=RU.IDUSUARIO AND RU.IDROL=R.IDROL";
            if(activo)
                query += " AND RU.ACTIVO = 1";
            else
                query += " AND RU.ACTIVO = 0";
            query += " ORDER BY U.APELLIDO, U.NOMBRE";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Usuario u =new Usuario();
                u.setIdUsuario( rs.getInt("U.IDUSUARIO") );
                u.setNombre(rs.getString("U.NOMBRE"));
                u.setApellido(rs.getString("APELLIDO"));
                u.setCi(rs.getString("CI"));
                u.setExpedidoEn(rs.getString("EXPEDIDOEN"));
                u.setGenero(rs.getString("GENERO").charAt(0));
                u.setTelefono(rs.getString("TELEFONO"));
                u.setEmail(rs.getString("EMAIL"));
                u.setDireccion(rs.getString("DIRECCION"));
                u.setFechaNac(rs.getString("FECHANAC"));
                u.setLogin(rs.getString("LOGIN"));
                
                Pais pa = new Pais();
                pa.setIdPais(rs.getInt("PA.IDPAIS"));
                pa.setNombre(rs.getString("PA.NOMBRE"));
                pa.setSigla(rs.getString("PA.SIGLA"));

                Ciudad ci = new Ciudad();
                ci.setIdCiudad(rs.getInt("C.IDCIUDAD"));
                ci.setNombre(rs.getString("C.NOMBRE"));
                ci.setSigla(rs.getString("C.SIGLA"));
                ci.setPais(pa);
                
                Categoria ca = new Categoria();
                ca.setIdCategoria(rs.getInt("IDCATEGORIA"));
                ca.setNombre(rs.getString("CA.NOMBRE"));
                ca.setSigla(rs.getString("CA.SIGLA"));
                
                DetalleDocente dd = new DetalleDocente();
                dd.setIdDetalleDocente(ca.getIdCategoria());
                dd.setLocalidad(rs.getString("LOCALIDAD"));
                dd.setCategoria(ca);
                dd.setCiudad(ci);
                
                u.setDetalleDocente(dd);
                
                Rol rol = new Rol();
                rol.setIdRol(rs.getInt("IDROL"));
                rol.setNombre(rs.getString("R.NOMBRE"));
                
                RolUsuario rolUsuario = new RolUsuario();
                rolUsuario.setIdUsuario(u.getIdUsuario());
                rolUsuario.setIdRol(rol.getIdRol());
                rolUsuario.setRol(rol);
                rolUsuario.setUsuario(u);
                
                rolUsuarios.add(rolUsuario);
            }
        }catch(SQLException e){
            throw new DataException("Error! AdminRolUsuario -> getUsuarios(boolean activo) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return rolUsuarios;
    }
    @Override
    public void darBajaRolUsuario(int idUsuario, int idRol) throws DataException {
        try{
            this.darAltaBaja(false, idUsuario, idRol);
        }catch(DataException e){
            throw new DataException(" AdminRolUsuario -> darBajaRolUsuario(idUsuario, idRol) "+e.getMessage());
        }
    }
    @Override
    public void darAltaRolUsuario(int idUsuario, int idRol) throws DataException {
        try{
            this.darAltaBaja(true, idUsuario, idRol);
        }catch(DataException e){
            throw new DataException(" AdminRolUsuario -> darAltaRolUsuario(idUsuario, idRol) "+e.getMessage());
        }
    }
    public void darAltaBaja(boolean activo, int idUsuario, int idRol) throws DataException{
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE ROL_USUARIO";
            if(activo)
                query +=" SET ACTIVO = 1";
            else
                query +=" SET ACTIVO = 0";
            query +=" WHERE IDUSUARIO = "+idUsuario+" AND IDROL="+idRol;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminRolUsuario-> darAltaBaja(activo,idUsuario,idRol) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }

    public RolUsuario getRolUsuario(int idUsuario, int idRol) throws DataException {
        RolUsuario rolUsuario = new RolUsuario();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT U.IDUSUARIO";
            query += ", U.NOMBRE";
            query += ", U.APELLIDO";
            query += ", U.CI";
            query += ", U.EXPEDIDOEN";
            query += ", U.GENERO";
            query += ", U.TELEFONO";
            query += ", U.EMAIL";
            query += ", U.DIRECCION";
            query += ", DATE_FORMAT(U.FECHANAC,'%d/%m/%Y') AS FECHANAC";
            query += ", U.LOGIN";
            query += ", PA.IDPAIS, PA.NOMBRE, PA.SIGLA";
            query += ", C.IDCIUDAD, C.NOMBRE, C.SIGLA";
            query += ", CA.IDCATEGORIA, CA.NOMBRE, CA.SIGLA";
            query += ", DD.LOCALIDAD";
            query += ", R.IDROL, R.NOMBRE";
            query += " FROM USUARIO U";
            query += " INNER JOIN (DETALLE_DOCENTE DD INNER JOIN (CIUDAD C INNER JOIN PAIS PA ON C.IDPAIS=PA.IDPAIS) ON DD.IDPAIS=C.IDPAIS AND DD.IDCIUDAD=C.IDCIUDAD)";
            query += " ON U.IDUSUARIO=DD.IDDETALLE_DOCENTE, CATEGORIA CA, ROL_USUARIO RU, ROL R";
            query += " WHERE DD.IDCATEGORIA=CA.IDCATEGORIA AND U.IDUSUARIO=RU.IDUSUARIO AND RU.IDROL=R.IDROL";
            query += " AND RU.ACTIVO = 1";
            query += " AND RU.IDUSUARIO="+idUsuario;
            query += " AND RU.IDROL="+idRol;            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next()){
                Usuario u =new Usuario();
                u.setIdUsuario( rs.getInt("U.IDUSUARIO") );
                u.setNombre(rs.getString("U.NOMBRE"));
                u.setApellido(rs.getString("APELLIDO"));
                u.setCi(rs.getString("CI"));
                u.setExpedidoEn(rs.getString("EXPEDIDOEN"));
                u.setGenero(rs.getString("GENERO").charAt(0));
                u.setTelefono(rs.getString("TELEFONO"));
                u.setEmail(rs.getString("EMAIL"));
                u.setDireccion(rs.getString("DIRECCION"));
                u.setFechaNac(rs.getString("FECHANAC"));
                u.setLogin(rs.getString("LOGIN"));
                
                Pais pa = new Pais();
                pa.setIdPais(rs.getInt("PA.IDPAIS"));
                pa.setNombre(rs.getString("PA.NOMBRE"));
                pa.setSigla(rs.getString("PA.SIGLA"));

                Ciudad c = new Ciudad();
                c.setIdCiudad(rs.getInt("C.IDCIUDAD"));
                c.setNombre(rs.getString("C.NOMBRE"));
                c.setSigla(rs.getString("C.SIGLA"));
                c.setPais(pa);
                
                Categoria ca = new Categoria();
                ca.setIdCategoria(rs.getInt("IDCATEGORIA"));
                ca.setNombre(rs.getString("CA.NOMBRE"));
                ca.setSigla(rs.getString("CA.SIGLA"));
                
                DetalleDocente dd = new DetalleDocente();
                dd.setIdDetalleDocente(ca.getIdCategoria());
                dd.setLocalidad(rs.getString("LOCALIDAD"));
                dd.setCategoria(ca);
                dd.setCiudad(c);
                
                u.setDetalleDocente(dd);
                
                Rol rol = new Rol();
                rol.setIdRol(rs.getInt("IDROL"));
                rol.setNombre(rs.getString("R.NOMBRE"));
                
                rolUsuario.setIdUsuario(u.getIdUsuario());
                rolUsuario.setIdRol(rol.getIdRol());
                rolUsuario.setRol(rol);
                rolUsuario.setUsuario(u);
            }
        }catch(SQLException e){
            throw new DataException("Error! AdminRolUsuario -> getRolUsuario(idUsuario, idRol) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return rolUsuario;
    }
    @Override
    public List<RolUsuario> getAdminsActivos() throws DataException {
        List<RolUsuario> rol_usuariosActivos = new ArrayList<RolUsuario>();
        try{
            rol_usuariosActivos = this.getAdministrativos(true);
        }catch(DataException e){
            throw new DataException("Error!!! AdminRolUsuario -> getAdminsActivos() "+e.getMessage());
        }
        return rol_usuariosActivos;
    }
    @Override
    public List<RolUsuario> getAdminsInactivos() throws DataException {
        List<RolUsuario> rol_usuariosActivos = new ArrayList<RolUsuario>();
        try{
            rol_usuariosActivos = this.getAdministrativos(false);
        }catch(DataException e){
            throw new DataException("Error!!! AdminRolUsuario -> getAdminsInactivos() "+e.getMessage());
        }
        return rol_usuariosActivos;
    }

    private List<RolUsuario> getAdministrativos(boolean activo) throws DataException{
        List<RolUsuario> rolUsuarios = new ArrayList<RolUsuario>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT U.IDUSUARIO";
            query += ", U.NOMBRE";
            query += ", U.APELLIDO";
            query += ", U.CI";
            query += ", U.EXPEDIDOEN";
            query += ", U.GENERO";
            query += ", U.TELEFONO";
            query += ", U.EMAIL";
            query += ", U.DIRECCION";
            query += ", DATE_FORMAT(U.FECHANAC,'%d/%m/%Y') AS FECHANAC";
            query += ", U.LOGIN";
            query += ", PA.IDPAIS, PA.NOMBRE, PA.SIGLA";
            query += ", C.IDCIUDAD, C.NOMBRE, C.SIGLA";
            query += ", CA.IDCARGO, CA.NOMBRE, CA.ACTIVO";
            query += ", R.IDROL, R.NOMBRE";
            query += ", DA.IDFACULTAD";
            query += " FROM USUARIO U";
            query += " INNER JOIN (DETALLE_ADMINISTRATIVO DA INNER JOIN (CIUDAD C INNER JOIN PAIS PA ON C.IDPAIS=PA.IDPAIS) ON DA.IDPAIS=C.IDPAIS AND DA.IDCIUDAD=C.IDCIUDAD)";
            query += " ON U.IDUSUARIO=DA.IDDETALLE_ADMINISTRATIVO, CARGO CA, ROL_USUARIO RU, ROL R";
            query += " WHERE DA.IDCARGO=CA.IDCARGO AND U.IDUSUARIO=RU.IDUSUARIO AND RU.IDROL=R.IDROL AND U.IDUSUARIO <> 1";// q sea diferente porq es adminis
            if(activo)
                query += " AND RU.ACTIVO = 1";
            else
                query += " AND RU.ACTIVO = 0";
            query += " ORDER BY U.APELLIDO, U.NOMBRE";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Usuario u =new Usuario();
                u.setIdUsuario( rs.getInt("U.IDUSUARIO") );
                u.setNombre(rs.getString("U.NOMBRE"));
                u.setApellido(rs.getString("APELLIDO"));
                u.setCi(rs.getString("CI"));
                u.setExpedidoEn(rs.getString("EXPEDIDOEN"));
                u.setGenero(rs.getString("GENERO").charAt(0));
                u.setTelefono(rs.getString("TELEFONO"));
                u.setEmail(rs.getString("EMAIL"));
                u.setDireccion(rs.getString("DIRECCION"));
                u.setFechaNac(rs.getString("FECHANAC"));
                u.setLogin(rs.getString("LOGIN"));
                
                Pais pa = new Pais();
                pa.setIdPais(rs.getInt("PA.IDPAIS"));
                pa.setNombre(rs.getString("PA.NOMBRE"));
                pa.setSigla(rs.getString("PA.SIGLA"));

                Ciudad ci = new Ciudad();
                ci.setIdCiudad(rs.getInt("C.IDCIUDAD"));
                ci.setNombre(rs.getString("C.NOMBRE"));
                ci.setSigla(rs.getString("C.SIGLA"));
                ci.setPais(pa);
                
                Cargo ca = new Cargo();
                ca.setIdCargo(rs.getInt("CA.IDCARGO"));
                ca.setNombre(rs.getString("CA.NOMBRE"));
                ca.setActivo(rs.getBoolean("CA.ACTIVO"));
                
                DetalleAdministrativo da = new DetalleAdministrativo();
                da.setIdFacultad(rs.getInt("IDFACULTAD"));
                da.setCargo(ca);
                da.setCiudad(ci);
                
                u.setDetalleAdministrativo(da);
                
                Rol rol = new Rol();
                rol.setIdRol(rs.getInt("IDROL"));
                rol.setNombre(rs.getString("R.NOMBRE"));
                
                RolUsuario rolUsuario = new RolUsuario();
                rolUsuario.setIdUsuario(u.getIdUsuario());
                rolUsuario.setIdRol(rol.getIdRol());
                rolUsuario.setRol(rol);
                rolUsuario.setUsuario(u);
                
                rolUsuarios.add(rolUsuario);
            }
        }catch(SQLException e){
            throw new DataException(" AdminRolUsuario -> getAdministrativos(boolean activo) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return rolUsuarios;
    }

    public RolUsuario getRolUsuarioAdmin(int idUsuario, int idRol) throws DataException {
        RolUsuario rolUsuario = new RolUsuario();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT U.IDUSUARIO";
            query += ", U.NOMBRE";
            query += ", U.APELLIDO";
            query += ", U.CI";
            query += ", U.EXPEDIDOEN";
            query += ", U.GENERO";
            query += ", U.TELEFONO";
            query += ", U.EMAIL";
            query += ", U.DIRECCION";
            query += ", DATE_FORMAT(U.FECHANAC,'%d/%m/%Y') AS FECHANAC";
            query += ", U.LOGIN";
            query += ", PA.IDPAIS, PA.NOMBRE, PA.SIGLA";
            query += ", C.IDCIUDAD, C.NOMBRE, C.SIGLA";
            query += ", CA.IDCARGO, CA.NOMBRE, CA.ACTIVO";
            query += ", R.IDROL, R.NOMBRE";
            query += ", DA.IDFACULTAD";
            query += " FROM USUARIO U";
            query += " INNER JOIN (DETALLE_ADMINISTRATIVO DA INNER JOIN (CIUDAD C INNER JOIN PAIS PA ON C.IDPAIS=PA.IDPAIS) ON DA.IDPAIS=C.IDPAIS AND DA.IDCIUDAD=C.IDCIUDAD)";
            query += " ON U.IDUSUARIO=DA.IDDETALLE_ADMINISTRATIVO, CARGO CA, ROL_USUARIO RU, ROL R";
            query += " WHERE DA.IDCARGO=CA.IDCARGO AND U.IDUSUARIO=RU.IDUSUARIO AND RU.IDROL=R.IDROL";
            query += " AND RU.ACTIVO = 1";
            query += " AND RU.IDUSUARIO="+idUsuario;
            query += " AND RU.IDROL="+idRol;
            query += " ORDER BY U.APELLIDO, U.NOMBRE";           
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next()){
                Usuario u =new Usuario();
                u.setIdUsuario( rs.getInt("U.IDUSUARIO") );
                u.setNombre(rs.getString("U.NOMBRE"));
                u.setApellido(rs.getString("APELLIDO"));
                u.setCi(rs.getString("CI"));
                u.setExpedidoEn(rs.getString("EXPEDIDOEN"));
                u.setGenero(rs.getString("GENERO").charAt(0));
                u.setTelefono(rs.getString("TELEFONO"));
                u.setEmail(rs.getString("EMAIL"));
                u.setDireccion(rs.getString("DIRECCION"));
                u.setFechaNac(rs.getString("FECHANAC"));
                u.setLogin(rs.getString("LOGIN"));
                
                Pais pa = new Pais();
                pa.setIdPais(rs.getInt("PA.IDPAIS"));
                pa.setNombre(rs.getString("PA.NOMBRE"));
                pa.setSigla(rs.getString("PA.SIGLA"));

                Ciudad ci = new Ciudad();
                ci.setIdCiudad(rs.getInt("C.IDCIUDAD"));
                ci.setNombre(rs.getString("C.NOMBRE"));
                ci.setSigla(rs.getString("C.SIGLA"));
                ci.setPais(pa);
                
                Cargo ca = new Cargo();
                ca.setIdCargo(rs.getInt("CA.IDCARGO"));
                ca.setNombre(rs.getString("CA.NOMBRE"));
                ca.setActivo(rs.getBoolean("CA.ACTIVO"));
                
                DetalleAdministrativo da = new DetalleAdministrativo();
                da.setIdFacultad(rs.getInt("IDFACULTAD"));
                da.setCargo(ca);
                da.setCiudad(ci);
                
                u.setDetalleAdministrativo(da);
                
                Rol rol = new Rol();
                rol.setIdRol(rs.getInt("IDROL"));
                rol.setNombre(rs.getString("R.NOMBRE"));
                
                rolUsuario.setIdUsuario(u.getIdUsuario());
                rolUsuario.setIdRol(rol.getIdRol());
                rolUsuario.setRol(rol);
                rolUsuario.setUsuario(u);
            }
        }catch(SQLException e){
            throw new DataException(" AdminRolUsuario -> getRolUsuarioAdmin(idUsuario, idRol) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return rolUsuario;
    }
}
